/*
 * @Author: WuFeng <763467339@qq.com>
 * @Date: 2022-03-22 12:12:49
 * @LastEditTime: 2023-06-12 16:22:17
 * @LastEditors: WuFeng <763467339@qq.com>
 * @Description: 鉴权
 * @FilePath: \vue3-element-plus-web\src\permission.js
 * @Copyright 版权声明
 */

import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css' // Progress 进度条样式
// import { Message } from 'element-ui'
import { ElMessage } from 'element-plus'
import { getToken } from '@/utils/auth' // 验权

const whiteList = ['/login', '/genderCode'] // 不重定向白名单
NProgress.configure({
  // 禁用进度环
  showSpinner: false
})
router.beforeEach((to, from, next) => {
  NProgress.start()
  // 更新vuex中iframeHref的状态为空
  store
    .dispatch('SetIframeHref', '')
    .then(() => {})
    .catch(() => {})
  // 获取token
  if (getToken()) {
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done() // if current page is dashboard will not trigger	afterEach hook, so manually handle it
    } else {
      if (store.getters.menusLoad === false) {
        // 判断当前用户是否已拉取完user_info信息
        store
          .dispatch('GetUserInfo')
          .then((res) => {
            // 拉取user_info
            const menus = res.data.menus
            // 根据 menus 权限生成可访问的路由表
            store
              .dispatch('GenerateRoutes', { menus })
              .then(() => {
                if (store.getters.addRouters.length > 0) {
                  for (const item of store.getters.addRouters) {
                    router.addRoute(item) // 动态添加可访问路由表
                  }
                }
                next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
              })
              .catch((err) => {
                err
                store.dispatch('FedLogOut').then(() => {
                  // ElMessage.error(
                  //   err || '验证失败，请重新登录！'
                  // )
                  ElMessage.error(
                    '验证失败，请重新登录！'
                  )
                  next({ path: '/' })
                })
              })
          })
          .catch((err) => {
            store.dispatch('FedLogOut').then(() => {
              ElMessage.error(err || '验证失败，请再次登陆！')
              next({
                path: '/login',
                query: { redirect: '401', random: Math.random() }
              })
            })
          })
      } else {
        next() // 当有用户权限的时候，说明所有可访问路由已生成 如访问没权限的全面会自动进入404页面
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done() // 结束Progress
})
